package demo4j;

import apijson.RequestMethod;
import apijson.orm.Parser;
import com.alibaba.fastjson.JSONObject;
import demo4j.apijson.APIJSONParser;
import demo4j.utils.WebUtil;
import org.springframework.web.bind.annotation.*;
import unitauto.MethodUtil;

import java.util.Arrays;
import java.util.List;

/**
 * 请求路由入口控制器，包括通用增删改查接口等，转交给 apijson 的 Parser 来处理
 * 具体见 SpringBoot 文档
 * <a href="https://www.springcloud.cc/spring-boot.html#boot-features-spring-mvc">spring-boot-features-spring-mvc</a>
 * 以及 apijson 通用文档 3.设计规范 3.1 操作方法
 * <a href="https://github.com/Tencent/APIJSON/blob/master/Document.md#3.1">APIJSON</a>
 * <br > 建议全通过HTTP POST来请求:
 * <br > 1.减少代码 - 客户端无需写HTTP GET,PUT等各种方式的请求代码
 * <br > 2.提高性能 - 无需URL encode和decode
 * <br > 3.调试方便 - 建议使用 APIAuto(<a href="http://apijson.cn/api">http://apijson.cn/api</a>) 或 Postman
 *
 * @author Lemon
 */
@RestController
@RequestMapping
public class CommonController {
    public static final List<String> METHODS = Arrays.asList("get", "head", "gets", "heads", "post", "put", "delete");

    public Parser<Long> newParser(RequestMethod method) {
        APIJSONParser parser = new APIJSONParser();
        parser.setMethod(method);
        parser.setSession(WebUtil.getHttpSession());
        parser.setRequestURL(WebUtil.getHttpServletRequest().getRequestURL().toString());
        return parser;
    }

    /**
     * 增删改查统一接口，这个一个接口可替代 7 个万能通用接口，牺牲一些路由解析性能来提升一点开发效率
     */
    @PostMapping(value = "/{method}")
    public String crud(@PathVariable("method") String method, @RequestBody String request) {
        if (METHODS.contains(method.toLowerCase())) {
            return newParser(RequestMethod.valueOf(method.toUpperCase())).setNeedVerify(false).parse(request);
        }
        return APIJSONParser.newErrorResult(new IllegalArgumentException("URL 路径 /{method} 中 method 值 " + method + " 错误！只允许 " + METHODS + " 中的一个！")).toJSONString();
    }

    @PostMapping("method/list")
    public JSONObject listMethod(@RequestBody String request) {
        return MethodUtil.listMethod(request);
    }
}